﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace Mozlite.Components
{
    /// <summary>
    /// 用户实体类。
    /// </summary>
    [Serializable]
    public class User
    {
        /// <summary>
        /// 初始化类<see cref="User"/>。
        /// </summary>
        public User() {
            PublicKey = Guid.NewGuid();
            RoleLevel = Components.RoleLevel.Register;
        }

        /// <summary>
        /// 公开ID。
        /// </summary>
        [XmlIgnore]
        public Guid PublicKey { get; set; }

        /// <summary>
        /// 用户ID。
        /// </summary>
        [XmlIgnore]
        public int UserID { get; set; }

        /// <summary>
        /// 用户名称。
        /// </summary>
        [XmlIgnore]
        public string UserName { get; set; }

        /// <summary>
        /// 密码。
        /// </summary>
        [XmlIgnore]
        public string Password { get; set; }

        /// <summary>
        /// 电子邮件。
        /// </summary>
        [XmlIgnore]
        public string Email { get; set; }

        /// <summary>
        /// 显示名称。
        /// </summary>
        [XmlIgnore]
        public string DisplayName { get; set; }

        /// <summary>
        /// 角色等级。
        /// </summary>
        [XmlIgnore]
        public RoleLevel RoleLevel { get; set; }

        /// <summary>
        /// 账户状态。
        /// </summary>
        [XmlIgnore]
        public AccountStatus AccountStatus { get; set; }

        /// <summary>
        /// 最后登录时间。
        /// </summary>
        [XmlIgnore]
        public DateTime LastLoginDate { get; set; }

        /// <summary>
        /// 最后登录IP。
        /// </summary>
        [XmlIgnore]
        public string LoginIP { get; set; }

        /// <summary>
        /// 注册IP。
        /// </summary>
        [XmlIgnore]
        public string RegisterIP { get; set; }

        /// <summary>
        /// 是否匿名用户。
        /// </summary>
        [XmlIgnore]
        public bool IsAnonymous
        {
            get
            {
                return RoleLevel == Components.RoleLevel.Anonymous || this.UserName.IsCaseInsensitiveEqual(Users.Anonymous);
            }
        }

        private UserCookie cookie;
        /// <summary>
        /// 当前用户Cookie实例。
        /// </summary>
        [XmlIgnore]
        public UserCookie Cookie
        {
            get
            {
                if (cookie == null)
                    cookie = new UserCookie(this);
                return cookie;
            }
        }

        /// <summary>
        /// 当前用户是否被允许。
        /// </summary>
        /// <param name="role">角色类型。</param>
        /// <returns>返回判断结果。</returns>
        public bool IsAllowed(RoleLevel role)
        {
            return role == Components.RoleLevel.Anonymous || (this.RoleLevel & role) == role;
        }

        /// <summary>
        /// 获取或设置注册时间。
        /// </summary>
        [XmlIgnore]
        public DateTime CreateDate { get; set; }

        /// <summary>
        /// 获取或设置最后更新时间。
        /// </summary>
        [XmlIgnore]
        public DateTime LastUpdateDate { get; set; }
    }
}
